package pfc.aviloc.aplicacion.citas_medico;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

import org.xml.sax.InputSource;

import pfc.aviloc.R;
import pfc.aviloc.comunicacion.Comunicacion;
import pfc.aviloc.configuracion.ConfiguracionPreferenceActivity;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class CitasMedicoCrearAlarmService extends Service {

	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		if (comprobarAlarmaActiva()){
			ArrayList<CitasMedico> listaCitasMedico;
			if (comprobarServidor() && comprobarResgistroUsuario() && comprobarConexion()) {			
				// recuperamos los datos del servidor. 
				listaCitasMedico = obtenerCitasMedicoServidor();			
				if (listaCitasMedico!=null){
					// almacenamos los datos. 
					boolean correcto = guardarCitasMedicoBD(listaCitasMedico);
				} else {
					// recuperamos los ultimos datos almacenados
					listaCitasMedico = obtenerCitasMedicoBD();
				} 
			} else {
				// recuperamos los ultimos datos almacenados
				listaCitasMedico = obtenerCitasMedicoBD();
			}
			crearAlarma(listaCitasMedico);
		}
		
		stopSelf();
	}

	public boolean crearAlarma(ArrayList<CitasMedico> listaCitasMedico){
		final int ALARM_REQUEST_CODE = 1;

		//Intent intent = new Intent(this, CitasMedicoAlarmReceiver.class);
		Intent intent = new Intent(this, CitasMedicoAlarmActivity.class);
		PendingIntent pendingIntent = null;
		AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
		Calendar calendar = Calendar.getInstance();
		Log.i("info", "----> lista = <----------"+ listaCitasMedico.size());
		for (CitasMedico citasMedico : listaCitasMedico) {
			//Log.i("info", "----> mensaje <----------");
			//Log.i("info", "----> tiempo en milisegundos = "+System.currentTimeMillis()+" <----------");
			long tiempoActual = System.currentTimeMillis();
//			calendar.set(2012, 6, 23, 9, 58);
//			Log.i("info", "----> calendario 1 = "+calendar.getTimeInMillis()+" <----------");
//			calendar.set(2012, 6, 23, 8, 58);
//			Log.i("info", "----> calendario 2 = "+calendar.getTimeInMillis()+" <----------");
			calendar.set(new Integer(citasMedico.getFecha_ano()), ( (new Integer(citasMedico.getFecha_mes())-1)), new Integer(citasMedico.getFecha_dia()), new Integer(citasMedico.getHora().substring(0,2)),  new Integer(citasMedico.getHora().substring(3)) );
						
			if (tiempoActual < calendar.getTimeInMillis()) {
				calendar.add(Calendar.HOUR, -1);
			
				String id_cita = citasMedico.getId();
				intent.putExtra("id_cita", id_cita);
				//Log.i("info", "---- Calendario 3 => "+calendar.getTimeInMillis()+" <----------");
	
				pendingIntent = PendingIntent.getActivity(this, ALARM_REQUEST_CODE, intent, 200000+(new Integer(id_cita)));
				alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
	
				calendar.set(new Integer(citasMedico.getFecha_ano()), ( (new Integer(citasMedico.getFecha_mes())) - 1), new Integer(citasMedico.getFecha_dia()), 12, 0);
				calendar.add(Calendar.HOUR, -24);
				//Log.i("info", "---- Calendario 3 => "+calendar.getTimeInMillis()+" <----------");
				//pendingIntent = PendingIntent.getBroadcast(this, ALARM_REQUEST_CODE, intent, 100000+(new Integer(id_cita)));			
				pendingIntent = PendingIntent.getActivity(this, ALARM_REQUEST_CODE, intent, 100000+(new Integer(id_cita)));
				alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
			}
		}
		return true;
	}
	
	private ArrayList<CitasMedico> obtenerCitasMedicoBD(){
		CitasMedicoBD cmBD = new CitasMedicoBD(this, this.getString(R.string.cm_bd_nombre_base_datos), null, this.getResources().getInteger(R.integer.cm_bd_version));
		ArrayList<CitasMedico> listaCitasMedico = cmBD.recuperarBD();
		
		return listaCitasMedico;
	}
	
	private boolean guardarCitasMedicoBD(ArrayList<CitasMedico> listaCitasMedico){		
		
	 	CitasMedicoBD cmBD = new CitasMedicoBD(this, this.getString(R.string.cm_bd_nombre_base_datos), null, this.getResources().getInteger(R.integer.cm_bd_version));
	 
	 	boolean  correcto = true;
	 	boolean insertado = false;
	 	for (CitasMedico citaMedico : listaCitasMedico) {	
	 		//CitasMedico citaMedico = listaCitasMedico.iterator().next();
	 		//Log.i("INFO",">>>>>>>>>insertar>>>>>>>>>>"+citaMedico);
	 		insertado = cmBD.insertarBD(citaMedico);			
	 		correcto = correcto && insertado;	 		
		}				
		return correcto;		
	}
	
	private ArrayList<CitasMedico> obtenerCitasMedicoServidor(){
		
		ArrayList<CitasMedico> returnDatos = null;

  		InputSource respuestaXMLInputSource = null;
		
		try {
			Map<String, String> kvParameters = new HashMap<String, String>();
			String key = getString(R.string.cm_clave_param_idUsuario);
			String valor = ConfiguracionPreferenceActivity.getIdUsuario(this);
			kvParameters.put(key, valor);	
			
			String url = ConfiguracionPreferenceActivity.getDireccionServidor(this)+ getString(R.string.cm_url_citas_medico);
			
			// llamamos al servidor por la url y pasandole el id del usuario: recibiendo un inputsource para parsear.
			respuestaXMLInputSource = Comunicacion.getXML(url, kvParameters);
			
			CitasMedicoParseador  cmParseador = new CitasMedicoParseador(this);
			returnDatos = cmParseador.getCitasMedicos(respuestaXMLInputSource);
			
			if (returnDatos == null) {
				boolean error = cmParseador.error;
				String tipoError = cmParseador.tipoError;
			}
			cmParseador = null;
		} catch (Exception e) {
			returnDatos = null;
		}

		return returnDatos;
	}	
	
	private boolean comprobarConexion() {	
		String urlString = ConfiguracionPreferenceActivity.getDireccionServidor(this);
		int timeOut = this.getResources().getInteger(R.integer.TIME_OUT_SINCRONISMO);
		try {
			return Comunicacion.doPing(urlString, timeOut);
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}
	
	private boolean comprobarServidor() {
		return ConfiguracionPreferenceActivity.isSincronismoServidor(this);
	}

	private boolean comprobarResgistroUsuario() {
		return ConfiguracionPreferenceActivity.isRegistroMovilEnServidor(this);
	}
	
	private boolean comprobarAlarmaActiva() {
		return ConfiguracionPreferenceActivity.isAlarmaCitasMedico(this);
	}
}
